package com.qfmy.webapp.mapper.novel;


import com.qfmy.model.entity.novel.Novel;
import com.qfmy.model.query.novel.NovelQuery;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;

import java.math.BigDecimal;
import java.util.List;


/**
 * @author 清风明月
 * @Package com.qfmy.web.app.mapper.novel
 * @date 2025/11/13
 * @description 小说
 */
@Mapper
@SuppressWarnings("all")
public interface NovelMapper {

    /**
     * 根据分类id获取标签
     * @param categoryIds
     * @return
     */
    List<String> getCategoryTagsByCategoryIds(List<Long> categoryIds);

    /**
     * 获取热门小说
     * @param categoryId
     * @return
     */
    List<Novel> getHotNovels(Integer categoryId);

    /**
     * 获取小说排行
     * @return
     */
    List<Novel> getRank();

    /**
     * 获取免费小说
     * @return
     */
    List<Novel> getFreeNovels();

    /**
     * 获取评分最高小说
     * @return
     */
    List<Novel> getTop2ScoreNovels();

    /**
     * 获取最热小说
     * @param start
     * @param pageSize
     * @return
     */
    List<Novel> getHotEnd(int start, Integer pageSize);

    /**
     * 获取今日热门
     *
     * @param tagArray
     * @param start
     * @param pageSize
     * @return
     */
    List<Novel> getHotRank(String[] tagArray, int start, Integer pageSize);

    /**
     * 获取最新小说
     * @param start
     * @param pageSize
     * @return
     */
    List<Novel> getNewBooks(int start, Integer pageSize);

    /**
     * 获取热门小说
     * @param start
     * @param pageSize
     * @return
     */
    List<Novel> getHotNovelsPage(Integer start, Integer pageSize);

    /**
     * 获取猜你喜欢的小说
     * @param recommendedNovelIds
     * @return
     */
    List<Novel> findNovelsByIds(List<Long> recommendedNovelIds);

    /**
     * 获取新书推荐
     * @return
     */
    List<Novel> getNewBooksYanXuan();

    /**
     * 获取精品新书
     * @param start
     * @param pageSize
     * @return
     */
    List<Novel> getJingPinNewBooks(int start, Integer pageSize);

    /**
     * 获取免费小说
     * @param start
     * @param pageSize
     * @return
     */
    List<Novel> getNewFreeNovels(int start, Integer pageSize);

    /**
     * 获取精品新书
     * @return
     */
    List<Novel> getJingXuanNewBooks();

    /**
     * 获取免费小说排行
     * @param start
     * @param pageSize
     * @return
     */
    List<Novel> getFreeRank(int start, Integer pageSize);

    /**
     * 获取潜力新书
     * @param start
     * @param pageSize
     * @return
     */
    List<Novel> getPotentialNewBooks(int start, Integer pageSize);

    /**
     * 获取人气
     * @param start
     * @param pageSize
     * @return
     */
    List<Novel> getPopularity(int start, Integer pageSize);

    /**
     * 获取评分
     * @param start
     * @param pageSize
     * @return
     */
    List<Novel> getHighScore(int start, Integer pageSize);

    /**
     * 获取搜索
     * @param start
     * @param pageSize
     * @return
     */
    List<Novel> getSearch(int start, Integer pageSize);

    /**
     * 获取作者
     * @param authorName
     * @param novelId
     * @return
     */
    List<Novel> getNovelsByAuthorName(String authorName, Integer novelId);

    /**
     * 根据id获取小说
     * @param novelId
     * @return
     */
    Novel selectById(Integer novelId);

    /**
     * 修改
     * @param posterUrl
     * @param novelId
     */
    @Update("update novel set poster = #{posterUrl} where novel_id = #{novelId}")
    void updateByNovel(String posterUrl, Integer novelId);

    /**
     * 修改评分
     * @param novelId
     * @param newScore
     */
    @Update("update novel set score = #{newScore}, score_count = #{count} where novel_id = #{novelId}")
    void updateScore(Integer novelId, BigDecimal newScore, long count);

    /**
     * 获取推荐
     * @param novelQuery
     * @return
     */
    List<Novel> getRecomend(@Param("novelQuery") NovelQuery novelQuery);

    /**
     * 
     * @param novelQuery
     * @return
     */
    List<Novel> getHightRating(@Param("novelQuery") NovelQuery novelQuery);

    /**
     * 获取新书榜
     * @param novelQuery
     * @return
     */
    List<Novel> getNewBookRank(@Param("novelQuery") NovelQuery novelQuery);

    /**
     * 获取所有小说
     * @return
     */
    List<Novel> getAllNovel();

    /**
     * 获取推荐
     * @param start
     * @param size
     * @return
     */
    List<Novel> selectRecommendRank(int start, int size);

    /**
     * 获取评论
     * @param start
     * @param size
     * @return
     */
    List<Novel> selectCommentRank(int start, int size);

    /**
     * 修改小说阅读数
     * @param novelId
     */
    @Update("update novel set view_count = view_count + 1 where novel_id = #{novelId}")
    void updateNovelReads(Integer novelId);

    /**
     * 获取阅读数
     * @param topReadsNovels
     * @return
     */
    List<Novel> selectNovelsByIds(List<Integer> topReadsNovels);

    /**
     * 获取标签
     * @param tag
     * @param start
     * @param size
     * @return
     */
    List<Novel> getNovelsByTagsPage(String tag, int start, Integer size);

    /**
     * 修改小说搜索数
     * @param novelId
     */
    @Update("update novel set search_count = search_count + 1 where novel_id = #{novelId}")
    void updateNovelSearchCount(Integer novelId);

    /**
     * 搜索小说
     * @param keyword
     * @return
     */
    List<Novel> searchNovels(String keyword);

    /**
     * 根据名称获取小说
     * @param name
     * @return
     */
    Novel selectByNovelName(String name);

    /**
     * 根据标签获取小说
     * @param mostFrequentTags
     * @param novelIds
     * @return
     */
    Novel selectNovelsByTags(List<String> mostFrequentTags, List<Integer> novelIds);

    /**
     * 批量获取小说
     * @param novelIds
     * @return
     */
    List<Novel> selectBatchIds(List<Integer> novelIds);
}
